package admin

import (
	"e_mall_server/common"
	"e_mall_server/models"
	"e_mall_server/service"
	"errors"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"strconv"
)

/**
 * @Author: zhaobin
 * @Description TODO
 * @Date: 2022-04-26 0:39
 */

// Login 后台管理系统，用户登陆
func Login(c *gin.Context) {
	var param models.ManagerLoginParam
	if err := c.ShouldBind(&param); err != nil {
		ResponseError(c, "请求参数错误")
		return
	}
	zap.L().Debug("controller.Login", zap.Any("param", param))
	// 检查验证码
	//if !service.VerifyCaptcha(param.CaptchaId, param.CaptchaValue) {
	//	ResponseError(c, "验证码错误")
	//	return
	//}

	// 业务逻辑处理，判断账号密码是否正确
	managerInfo, err := service.Login(&param)
	if err != nil {
		zap.L().Error("service.Login failed", zap.Error(err))
		ResponseError(c, "用户名或密码错误")
		return
	}

	// 返回响应
	ResponseSuccess(c, managerInfo)
}

func Captcha(c *gin.Context) {
	id, b64s, err := service.MakeCaptcha()

	if err != nil {
		zap.L().Error("验证码刷新失败", zap.Error(err))
		ResponseError(c, "验证码刷新失败")
		return
	}

	ResponseSuccess(c, gin.H{
		"captchaId":    id,
		"captchaImage": b64s,
	})

}

// GetManagerList 获取管理员列表接口
func GetManagerList(c *gin.Context) {
	managerList, err := service.GetManagerList()
	if err != nil {
		zap.L().Error("service.GetManagerList() failed", zap.Error(err))
		ResponseError(c, "查询管理员列表失败")
		return
	}
	//zap.L().Debug("管理员列表数据", zap.Any("value", managerList))
	ResponseSuccess(c, managerList)
}

// AddManager 添加管理员信息接口
func AddManager(c *gin.Context) {
	manager := models.Manager{}
	if err := c.ShouldBind(&manager); err != nil {
		zap.L().Error("AddManager with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}

	// 业务逻辑处理
	if err := service.AddManager(&manager); err != nil {
		zap.L().Error("service.AddManager(&Manager) failed", zap.Error(err))
		ResponseError(c, err.Error())
		return
	}
	// 创建成功返回响应
	ResponseSuccess(c, nil)

}

// UpdateManager 修改管理员信息接口，用户名和密码不支持修改
func UpdateManager(c *gin.Context) {
	manager := models.Manager{}
	if err := c.ShouldBind(&manager); err != nil {
		zap.L().Error("UpdateManager with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}

	// 业务逻辑处理
	if count := service.UpdateManager(&manager); count > 0 {
		// 创建成功返回响应
		ResponseSuccess(c, nil)
		return
	}
	ResponseError(c, "修改管理员失败 请重试")
}

// DeleteManager 删除管理员接口
func DeleteManager(c *gin.Context) {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		zap.L().Error("DeleteManager with invalid param", zap.Error(err))
		ResponseError(c, "传入参数错误")
		return
	}
	if count := service.DeleteManagerById(id); count > 0 {
		ResponseSuccess(c, nil)
		return
	}
	ResponseError(c, "删除失败")
}

// 获取当前登陆的管理员id
func getCurrentManagerID(c *gin.Context) (managerID int64, err error) {
	// 获得管理员的id
	id, ok := c.Get(common.ContextManagerIDKey)
	if !ok {
		// 没有登陆
		err = errors.New("用户未登录")
		return
	}
	managerID, ok = id.(int64)
	if !ok {
		err = errors.New("用户未登录")
		return
	}
	return
}

// GetManagerDetailById 通过id查询管理员信息
func GetManagerDetailById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		zap.L().Error("GetManagerDetailById with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
	}
	manager, err := service.GetManagerDetailById(id)
	if err != nil {
		zap.L().Error("service.GetManagerDetailById(id) failed", zap.Error(err))
		ResponseError(c, "获取管理员信息错误")
		return
	}
	ResponseSuccess(c, manager)
}
